#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""文件整合后端服务
基于Flask框架，提供文件上传和数据整合功能，使用CSVDataFusion类处理数据并返回结果文件
"""
from flask import Flask, request, send_file, jsonify
from flask_cors import CORS
import os
import tempfile
from werkzeug.utils import secure_filename
from csv_data_fusion import CSVDataFusion

app = Flask(__name__)

# 配置CORS，允许来自所有域的请求
# 在生产环境中，建议将origins设置为具体的前端域名
CORS(app, resources={r"/api/*": {
    "origins": ["*"],
    "methods": ["GET", "POST"],
    "allow_headers": ["Content-Type"],
    "expose_headers": ["Content-Disposition"]
}})

# 设置上传文件大小限制（5MB）
app.config['MAX_CONTENT_LENGTH'] = 5 * 1024 * 1024

# 允许的文件类型
ALLOWED_CSV_EXTENSIONS = {'csv'}
ALLOWED_EXCEL_EXTENSIONS = {'xlsx', 'xls'}

# 创建临时目录用于存储上传的文件
TEMP_DIR = tempfile.gettempdir()


def allowed_file(filename, allowed_extensions):
    """检查文件扩展名是否在允许的列表中"""
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions


@app.route('/')
def index():
    """根路径，提供简单的服务状态信息"""
    return 'File Merge Service is running!'


@app.route('/api/merge-files', methods=['POST'])
def merge_files():
    """文件整合接口
    接收CSV文件和可选的Excel文件，根据整合类型进行处理并返回结果Excel文件
    
    请求参数：
        csvFile: 必需，CSV文件（最大5MB）
        excelFile: 可选，Excel文件（最大5MB）
        mergeType: 必需，整合类型（csv_only 或 csv_and_excel）
        
    返回：
        文件流（Excel格式）或错误信息
    """
    try:
        # 1. 验证请求参数
        if 'mergeType' not in request.form:
            return jsonify({'error': 'mergeType参数是必需的'}), 400
            
        merge_type = request.form['mergeType']
        if merge_type not in ['csv_only', 'csv_and_excel']:
            return jsonify({'error': 'mergeType参数值无效，必须是csv_only或csv_and_excel'}), 400
            
        # 2. 验证并保存上传的文件
        temp_files = []
        csv_path = None
        excel_path = None
        
        # 处理CSV文件
        if 'csvFile' not in request.files:
            return jsonify({'error': 'csvFile参数是必需的'}), 400
            
        csv_file = request.files['csvFile']
        if csv_file.filename == '':
            return jsonify({'error': '请选择一个CSV文件'}), 400
            
        if not allowed_file(csv_file.filename, ALLOWED_CSV_EXTENSIONS):
            return jsonify({'error': '不支持的CSV文件类型'}), 400
            
        # 保存CSV文件到临时目录
        csv_filename = secure_filename(csv_file.filename)
        csv_path = os.path.join(TEMP_DIR, f"csv_{os.urandom(8).hex()}_{csv_filename}")
        csv_file.save(csv_path)
        temp_files.append(csv_path)
        
        # 处理Excel文件（如果整合类型为csv_and_excel）
        if merge_type == 'csv_and_excel':
            if 'excelFile' not in request.files:
                return jsonify({'error': '当mergeType为csv_and_excel时，excelFile参数是必需的'}), 400
                
            excel_file = request.files['excelFile']
            if excel_file.filename == '':
                return jsonify({'error': '请选择一个Excel文件'}), 400
                
            if not allowed_file(excel_file.filename, ALLOWED_EXCEL_EXTENSIONS):
                return jsonify({'error': '不支持的Excel文件类型'}), 400
                
            # 保存Excel文件到临时目录
            print(excel_file.filename)
            excel_filename = secure_filename(excel_file.filename)
            print(excel_filename)
            excel_path = os.path.join(TEMP_DIR, f"excel_{os.urandom(8).hex()}.{excel_filename}")
            excel_file.save(excel_path)
            temp_files.append(excel_path)
            print(excel_path)
        
        try:
            # 3. 使用CSVDataFusion处理数据
            data_fusion = CSVDataFusion()
            
            # 创建临时输出文件
            output_path = os.path.join(TEMP_DIR, f"result_{os.urandom(8).hex()}.xlsx")
            temp_files.append(output_path)
            
            # 根据整合类型执行不同的处理逻辑
            if merge_type == 'csv_and_excel' and excel_path:
                # 先加载Excel文件（表格1）
                if not data_fusion.load_table1_data(excel_path):
                    return jsonify({'error': '加载Excel文件数据失败'}), 500
                    
            # 加载CSV文件（表格2）
            if not data_fusion.load_table2_data(csv_path):
                return jsonify({'error': '加载CSV文件数据失败'}), 500
                
            # 融合数据
            if not data_fusion.fuse_data():
                return jsonify({'error': '融合数据失败'}), 500
                
            # 生成Excel文件
            if not data_fusion.generate_excel(output_path):
                return jsonify({'error': '生成Excel文件失败'}), 500
                
            # 4. 返回生成的Excel文件
            return send_file(
                output_path,
                mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                as_attachment=True,
                download_name='merged_result.xlsx'
            )
        finally:
            # 清理临时文件
            for file_path in temp_files:
                try:
                    if os.path.exists(file_path):
                        os.remove(file_path)
                except Exception as e:
                    app.logger.error(f"删除临时文件失败: {str(e)}")
                    
    except Exception as e:
        app.logger.error(f"处理文件整合请求时出错: {str(e)}")
        return jsonify({'error': f'服务器内部错误: {str(e)}'}), 500


if __name__ == '__main__':
    """应用程序入口点，启动Flask开发服务器"""
    app.run(host='0.0.0.0', port=8080)